package com.atguigu.edu.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.edu.realtime.common.EduConfig;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.api.java.tuple.Tuple2;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * @author:ray
 * @time:2022/10/14 14:03
 * @description:
 **/
public class DimUtil {
    public static JSONObject getDimInfo(Connection conn,String tableName,String id){
        return getDimInfo(conn,tableName, Tuple2.of("id",id));
    }
    /**
     * @param conn
     * @param tableName
     * @param columnNameAndValues
     * @return 获取维度对象
     * 优化：旁路缓存
     * 思路：先从缓存中获取维度数据，如果缓存中存在维度数据，直接返回(缓存命中)；如果缓存中不存在维度数据，
     * 再发送请求到phoenix表中查询维度数据，并将查询出来的维度数据放到缓存中缓存起来，方便下次使用。
     * 选型：
     * Redis √
     * 性能也不错、维护性好
     * 状态
     * 性能好、维护性差
     * Redis使用分析：
     * 类型：     String
     * key：     dim:维度表表名:主键1_主键2
     * TTL:      1day
     * 注意： 如果业务数据库维度表发生了变化，将缓存中的维度删除
     */

    public static JSONObject getDimInfo(Connection conn,String tableName,Tuple2<String,String>... columnNameAndValues){
        //拼接从Redis中查询维度的key
        StringBuilder redisKey=new StringBuilder("dim:"+ tableName.toLowerCase()+":");
        StringBuilder selectSql=new StringBuilder(" select * from "+ EduConfig.PHOENIX_SCHEMA + "."+tableName+" where " );
        for(int i=0;i< columnNameAndValues.length;i++){
            Tuple2<String,String> columnAndValue=columnNameAndValues[i];
            String columnName= columnAndValue.f0;
            String columnValue = columnAndValue.f1;
            redisKey.append(columnValue);
            selectSql.append(columnName+"='"+columnValue+"'");
            if(i< columnNameAndValues.length-1){
                redisKey.append("_");
                selectSql.append(" and ");
            }

        }

        Jedis jedis = null;
        String dimInfoStr = null;
        JSONObject dimInfoJsonObj =null;

        try{
            jedis = RedisUtil.getJedis();
            dimInfoStr=jedis.get(redisKey.toString());
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("~~从Redis中查询维度数据发生了异常~~");
        }

        if(StringUtils.isNotEmpty(dimInfoStr)){
            dimInfoJsonObj= JSON.parseObject(dimInfoStr);
        }else{
            System.out.println("从phoenix表中查询维度的SQL:"+selectSql);
            List<JSONObject> dimInfoJsonList = PhoenixUtil.queryList(conn,selectSql.toString(),JSONObject.class);
            if(dimInfoJsonList != null && dimInfoJsonList.size()>0){
                dimInfoJsonObj = dimInfoJsonList.get(0);
                if(jedis != null){
                    jedis.setex(redisKey.toString(),3600*24,dimInfoJsonObj.toJSONString());
                }

            }else {
                System.out.println("~~在phoenix表中没有查到对应的维度信息~~");
            }
        }

        if(jedis != null){
            System.out.println("~~关闭Jedis客户端~~");
            jedis.close();
        }

        return dimInfoJsonObj;

    }

    public static  void delCached(String tableName,String id){
        String redisKey = "dim:" + tableName.toLowerCase()+":"+id;

        Jedis jedis =null;

        try{
            jedis = RedisUtil.getJedis();
            jedis.del(redisKey);
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(jedis != null ){
                System.out.println("~~从Redis中删除维度后，关闭Jedis客户端~~");
                jedis.close();
            }
        }
    }

}
